package DataStorage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

import HibernateSQLite.java.model.Echantillon;

public class EchantillonDAOHibernate extends
		GenericDAOHibernate<Echantillon, Long, IEchantillonDAO> implements
		IEchantillonDAO {

	@SuppressWarnings("unchecked")
	public boolean isExist(long Echantillon_id) {
		try {
			List<Echantillon> list = getSession()
					.createCriteria(Echantillon.class)
					.add(Restrictions.eq("Echantillon_id", Echantillon_id))
					.list();
			if (!list.isEmpty()) {
				return true;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return false;
	}

	@SuppressWarnings("unchecked")
	public boolean isExistInformationLigne_id(long InformationLigne_id) {
		try {
			List<Echantillon> list = getSession()
					.createCriteria(Echantillon.class)
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();
			if (!list.isEmpty()) {
				return true;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}

		return false;
	}

	@SuppressWarnings("unchecked")
	public boolean isExist(String Organe, String Nom, String Nombre,
			String Chemin, long InformationLigne_id) {
		try {
			List<Echantillon> list = getSession()
					.createCriteria(Echantillon.class)
					.add(Restrictions.eq("Organe", Organe))
					.add(Restrictions.eq("Nom", Nom))
					.add(Restrictions.eq("Nombre", Nombre))
					.add(Restrictions.eq("Chemin", Chemin))
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();

			if (!list.isEmpty()) {
				return true;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}

		return false;
	}

	public boolean isExist(Echantillon echantillon) {
		if (!echantillon.equals(null)) {
			long InformationLigne_id = echantillon.getInformationLigne_id();
			List<Echantillon> list = getListEchantillon(InformationLigne_id);
			if (list.contains(echantillon)) {
				return true;
			} else {
				return false;
			}
		}

		return false;
	}

	public boolean isExist_SousEnsembleComplementaire(long InformationLigne_id) {
		Echantillon echantillon = this
				.getSousEnsembleComplementaire(InformationLigne_id);
		String nombre = echantillon.getNombre();
		if (!nombre.equals("")) {
			return true;
		}
		return false;
	}

	public boolean isExist_SousEnsembleSupplementaire(long InformationLigne_id) {
		Echantillon echantillon = this
				.getSousEnsembleSupplementaire(InformationLigne_id);
		String nombre = echantillon.getNombre();
		if (!nombre.equals("")) {
			return true;
		}
		return false;
	}

	@SuppressWarnings("unchecked")
	public Echantillon getEchantillon(long Echantillon_id) {
		try {
			List<Echantillon> list = getSession()
					.createCriteria(Echantillon.class)
					.add(Restrictions.eq("Echantillon_id", Echantillon_id))
					.list();
			for (Echantillon echantillon : list) {
				return echantillon;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}

		return null;
	}

	public long getEchantillon_id(Echantillon echantillon) {
		return echantillon.getEchantillon_id();
	}

	public Echantillon getEchantillon_PiecePrincipale(long InformationLigne_id) {

		List<Echantillon> list = this.getListEchantillon(InformationLigne_id);
		List<Long> listEchantillon_id = new ArrayList<Long>();
		for (Echantillon echantillon : list) {
			listEchantillon_id.add(echantillon.getEchantillon_id());
		}
		long Echantillon_id = Collections.min(listEchantillon_id);

		return getEchantillon(Echantillon_id);
	}

	public Echantillon getEchantillon_SousEnsembleComplementaire(
			long InformationLigne_id) {

		List<Echantillon> list = this.getListEchantillon(InformationLigne_id);
		List<Long> listEchantillon_id = new ArrayList<Long>();
		for (Echantillon echantillon : list) {
			listEchantillon_id.add(echantillon.getEchantillon_id());
		}

		listEchantillon_id.remove(Collections.min(listEchantillon_id));
		listEchantillon_id.remove(Collections.max(listEchantillon_id));
		long Echantillon_id = 0;
		for (int i = 0; i < listEchantillon_id.size(); i++) {
			Echantillon_id = (Long) listEchantillon_id.get(i);

		}

		return getEchantillon(Echantillon_id);
	}

	public Echantillon getEchantillon_SousEnsembleSupplementaire(
			long InformationLigne_id) {

		List<Echantillon> list = this.getListEchantillon(InformationLigne_id);
		List<Long> listEchantillon_id = new ArrayList<Long>();
		for (Echantillon echantillon : list) {
			listEchantillon_id.add(echantillon.getEchantillon_id());
		}
		long Echantillon_id = Collections.max(listEchantillon_id);

		return getEchantillon(Echantillon_id);
	}

	@SuppressWarnings("unchecked")
	public List<Echantillon> getListEchantillon(long InformationLigne_id) {
		try {
			List<Echantillon> list = getSession()
					.createCriteria(Echantillon.class)
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();

			return list;
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return null;
	}

	public List<String> getListOP(long InformationLigne_id) {
		List<String> listOP = new ArrayList<String>();
		List<Echantillon> listEchantillon = this
				.getListEchantillon(InformationLigne_id);
		for (Echantillon echantillon : listEchantillon) {
			listOP.add(echantillon.getOP());
		}

		return listOP;
	}

	public int getNumber_PiecePrincipale(long InformationLigne_id) {
		Echantillon echantillon = getPiecePrincipale(InformationLigne_id);
		int nb = Integer.valueOf(echantillon.getNombre());
		return nb;
	}

	public int getNumbre_SousEnsembleComplementaire(long InformationLigne_id) {
		Echantillon echantillon = this
				.getSousEnsembleComplementaire(InformationLigne_id);
		int nb = Integer.valueOf(echantillon.getNombre());
		return nb;
	}

	public int getNumbre_SousEnsembleSupplementaire(long InformationLigne_id) {
		Echantillon echantillon = this
				.getSousEnsembleSupplementaire(InformationLigne_id);
		int nb = Integer.valueOf(echantillon.getNombre());
		return nb;
	}

	public String getChemin_PiecePrincipale(long InformationLigne_id) {
		Echantillon echantillon = getPiecePrincipale(InformationLigne_id);
		return echantillon.getChemin();
	}

	public String getChemin_SousEnsembleComplementaire(long InformationLigne_id) {
		Echantillon echantillon = this
				.getSousEnsembleComplementaire(InformationLigne_id);
		return echantillon.getChemin();
	}

	public String getChemin_SousEnsembleSupplementaire(long InformationLigne_id) {
		Echantillon echantillon = this
				.getSousEnsembleSupplementaire(InformationLigne_id);
		return echantillon.getChemin();
	}

	public String getOP_PiecePrincipale(long InformationLigne_id) {

		Echantillon echantillon = getPiecePrincipale(InformationLigne_id);
		return echantillon.getOP();
	}

	public String getOP_SousEnsembleComplementaire(long InformationLigne_id) {
		Echantillon echantillon = this
				.getSousEnsembleComplementaire(InformationLigne_id);
		return echantillon.getOP();
	}

	public String getOP_SousEnsembleSupplementaire(long InformationLigne_id) {
		Echantillon echantillon = this
				.getSousEnsembleSupplementaire(InformationLigne_id);
		return echantillon.getOP();
	}

	public Echantillon getPiecePrincipale(long InformationLigne_id) {
		EchantillonDAOHibernate EchantillonDAO = new EchantillonDAOHibernate();
		List<Echantillon> list = this.getListEchantillon(InformationLigne_id);
		List<Long> listEchantillon_id = new ArrayList<Long>();
		for (Echantillon echantillon : list) {
			listEchantillon_id.add(echantillon.getEchantillon_id());
		}
		long Echantillon_id = Collections.min(listEchantillon_id);
		Echantillon echantillon = EchantillonDAO.getEchantillon(Echantillon_id);
		return echantillon;
	}

	public Echantillon getSousEnsembleComplementaire(long InformationLigne_id) {
		EchantillonDAOHibernate EchantillonDAO = new EchantillonDAOHibernate();
		List<Echantillon> list = this.getListEchantillon(InformationLigne_id);
		List<Long> listEchantillon_id = new ArrayList<Long>();
		for (Echantillon echantillon : list) {
			listEchantillon_id.add(echantillon.getEchantillon_id());
		}

		listEchantillon_id.remove(Collections.min(listEchantillon_id));
		listEchantillon_id.remove(Collections.max(listEchantillon_id));
		long Echantillon_id = 0;
		for (int i = 0; i < listEchantillon_id.size(); i++) {
			Echantillon_id = (Long) listEchantillon_id.get(i);

		}
		Echantillon echantillon = EchantillonDAO.getEchantillon(Echantillon_id);
		return echantillon;
	}

	public Echantillon getSousEnsembleSupplementaire(long InformationLigne_id) {
		EchantillonDAOHibernate EchantillonDAO = new EchantillonDAOHibernate();
		List<Echantillon> list = this.getListEchantillon(InformationLigne_id);
		List<Long> listEchantillon_id = new ArrayList<Long>();
		for (Echantillon echantillon : list) {
			listEchantillon_id.add(echantillon.getEchantillon_id());
		}
		long Echantillon_id = Collections.max(listEchantillon_id);
		Echantillon echantillon = EchantillonDAO.getEchantillon(Echantillon_id);
		return echantillon;
	}

	public String getCheminPiecePrincipale(long InformationLigne_id) {
		Echantillon echantillon = getPiecePrincipale(InformationLigne_id);
		return echantillon.getChemin();
	}

	public String getCheminSousEnsembleComplementaire(long InformationLigne_id) {

		Echantillon echantillon = getSousEnsembleComplementaire(InformationLigne_id);
		return echantillon.getChemin();
	}

	public String getCheminSousEnsembleSupplementaire(long InformationLigne_id) {

		Echantillon echantillon = getSousEnsembleSupplementaire(InformationLigne_id);

		return echantillon.getChemin();
	}

	public void saveEchantillon(String Organe, String Nom, String Nombre,
			String Chemin, String OP, long InformationLigne_id) {
		try {
			Echantillon echantillon;
			if (!this.isExist(Organe, Nom, Nombre, Chemin, InformationLigne_id)) {
				echantillon = new Echantillon();
				echantillon.setOrgane(Organe);
				echantillon.setNombre(Nombre);
				echantillon.setNom(Nom);
				echantillon.setChemin(Chemin);
				echantillon.setOP(OP);
				echantillon.setInformationLigne_id(InformationLigne_id);

				getSession().save(echantillon);
			}
			this.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
	}

	public void saveEchantillon(List<String> Organe, List<String> Nom,
			List<String> Nombre, List<String> Chemin, List<String> OP,
			long InformationLigne_id) {

		int sizeOrgane = Organe.size();
		int sizeNom = Nom.size();
		int sizeNombre = Nombre.size();
		int sizeChemin = Chemin.size();
		int sizeOP = OP.size();
		String[] arr_Organe = (String[]) Organe.toArray(new String[sizeOrgane]);
		String[] arr_Nom = (String[]) Nom.toArray(new String[sizeNom]);
		String[] arr_Nombre = (String[]) Nombre.toArray(new String[sizeNombre]);
		String[] arr_Chemin = (String[]) Chemin.toArray(new String[sizeChemin]);
		String[] arr_OP = (String[]) OP.toArray(new String[sizeOP]);

		if (sizeOrgane == sizeNom && sizeOrgane == sizeNombre
				&& sizeOrgane == sizeChemin && sizeOrgane == sizeOP) {
			for (int i = 0; i < sizeOrgane; i++) {
				this.saveEchantillon(arr_Organe[i], arr_Nom[i], arr_Nombre[i],
						arr_Chemin[i], arr_OP[i], InformationLigne_id);
			}
		} else {
			System.out.println("erreur input");
		}
	}

	public void deleteEchantillons(long InformationLigne_id) {
		try {
			if (this.isExistInformationLigne_id(InformationLigne_id)) {
				List<Echantillon> listEchantillon = getListEchantillon(InformationLigne_id);
				this.deleAll(listEchantillon);
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
	}

	public static void main(String[] agrs) {

		EchantillonDAOHibernate e = new EchantillonDAOHibernate();
		
		  List<String> Organe = Arrays.asList("Pi�ce principale",
		  "Sous-ensemble compl�mentaire", "Sous-ensemble suppl�mentaire");
		  List<String> Nom = Arrays.asList("X91-2RD", "", ""); List<String>
		  Nombre = Arrays.asList("1", "", ""); List<String> Chemin =
		  Arrays.asList("1120021", "", ""); List<String> OP =
		  Arrays.asList("100", "", ""); long InformationLigne_id = 12222222;
		  e.saveEchantillon(Organe, Nom, Nombre, Chemin, OP,
		  InformationLigne_id);
		 
		long InformationLigne_id_2 = 12222222;
		e.deleteEchantillons(InformationLigne_id_2);
	}

}
